CSGO:利用AHK/AutoHotKey实现平滑压枪(最终版)

您所在的位置:网站首页 csgo bhop脚本 CSGO:利用AHK/AutoHotKey实现平滑压枪(最终版)

CSGO:利用AHK/AutoHotKey实现平滑压枪(最终版)

2023-07-02 14:02| 来源: 网络整理| 查看: 265

    写在前面:AutoHotKey,即AHK,类似于鼠标宏,属于模拟硬件操作的脚本,有些人也会称这类东西叫硬件作弊。它不会被VAC,但是有可能被OW。

    AHK如何使用请看我第一篇专栏:

    距上个版本的发布已经过了一个月的时间,实际上这一个月主要就是实现平滑压枪,以及Gui显示在不同分辨率下的适配(本来想做其他分辨率的自动检测,奈何水平有限,没想到很好的办法)。

    本版本主要特点:

    1、比上个版本更加平滑的压枪,其中ak47弹道进行了6倍插值(然而,还是有点抖),其余步枪进行了4倍插值(效果还行),剩余枪械进行了3倍插值(除了cz75,其他还好);

    2、弹道标注,包括压枪+标点以及纯标点两个版本;

    3、还是一样多的枪械,7把步枪+7把冲锋枪+cz75+m249;

    4、根据个人灵敏度生成准确的数据,不同灵敏度的压枪效果应该和我调试的时候一样好;

    5、不同分辨率下的Gui显示问题基本解决;

    6、增加了安全模式,按主键盘1开启压枪,2-0、E、G、Q关闭压枪,与主模式兼容;

    7、如果你有幸是up主同款分辨率(1920*1080),那么你可以用到强大的自动检测功能,并且开启后对压枪效果基本没有劣化(上个版本会对压枪效果产生可观的影响);

    8、官匹没有问题,5e与b5需要将脚本编译后使用(因为检测只检测ahk软件,但是编译后的脚本进程不是ahk,而是脚本本身);

    9、免费,开源,包含后坐力数据表。

    下面主要分享下脚本实现时的难点以及对csgo枪械的一些发现,还有源码。

    平滑处理,实际上就是将单次长距离移动变为多次短距离移动,使得鼠标移动与后坐力施加的曲线尽可能吻合。原理看起来非常简单,但是在我在实际实现的时候,发现了两个问题:

    1、鼠标移动精度限制:windows提供的api“mouse_event”在相对坐标移动时最小距离为1个像素点,然而在多倍插值的情况下,直接对距离进行除法会有大量小数产生,导致距离偏差很大;

    2、脚本睡眠精度限制:AHK自带的sleep函数精度只有可怜的10几ms,windows系统的自带的sleep也只有几ms,然而在多倍插值的情况下需要精度达到0.1ms。

    为了解决第一个问题,我首先利用c++写了个程序读取了csgo枪械在没有随机扩散情况下的后坐力数据,如下图所示:

ak47后坐力数据,要不是要平滑处理我能压成一个点

    这个具体原理不进行详细阐述,因为用这个方法完全可以写出透视自瞄。在有了能够精确到小数点后几位的数据后,剩下的问题就是如何尽可能精确地移动。

    在尝试直接除法效果奇差后,我最终用一套简单地算法把数据处理成每次移动都是整数的数据:首先对单段距离x进行除法分成N段,然后这N小段取最接近且不大于x/N的整数值,最后将N * floor(x / N)与x比较进行误差修正,加入小了M,则在N小段中的M段加1。如此一来,虽然每小段的移动有误差,但是整体加起来却能够将误差消除。为了确保不同鼠标灵敏度压枪的准确定,脚本中的压枪数据实际上是根据你设置的值生成的,所以所有高精度的后坐力数据也在脚本文件夹中,具体操作说明请看压缩包内文档。

    至于第二个问题,我真的是脑子都要想秃了。有人会问会什么需要这么高精度的睡眠,这是因为每发子弹间隔大概为几十ms,如果进行四倍插值,每次小段移动时间间隔仅有十几ms,如果每次移动误差零点几ms,30*4*0.5就有60ms的误差,足足错位了一个子弹间隔或者几个小段间隔。

    除此之外,由于csgo枪械每发子弹的时间间隔其实是在移动范围内随机波动的,如下图所示:

8轮射击的子弹时间间隔,单位us

    压枪其实就是在上发子弹射出后、下发子弹射出前将鼠标移动以补偿后坐力,在不进行插值的情况下,只需要在两发子弹间隔的正中间移动鼠标即可,时间裕度有半个子弹间隔,有几十ms;而在进行4倍插值的情况下,时间裕度大大减少,只有不到10ms,再考虑到射速随机波动的影响,睡眠精度如果不高很容易多移动一小段或者少移动一小段。

    其实高精度睡眠问题是个普遍的问题,在其他语言编程中也会遇到。常见的高精度睡眠有两种,一种是利用windows自带sleep配合timeBeginPeriod与timeEndPeriod达到比仅用sleep精度更高的睡眠,如下图所示:

第一种高精度睡眠

    这种睡眠的优点是cpu占用量非常小,但是缺点是仍然不够准,误差在零点几ms。

    还有一种睡眠是利用暴力地轮询,在循环中不断调用高精度计时器,然后判断是否已经达到设定时间,如下图所示:

暴力轮询

    这种方法可能是睡眠精度最高的方法之一了,能够达到0.1ms的精度。但是,这种方法对于cpu的占用率非常高,一直运行的话能够把cpu单个线程塞满。幸运的是,压枪脚本中的单次睡眠时间最多也就小几十ms,实测运行时对电脑性能影响不是太大。

    但是,cpu占用率高确实有影响。windows并不会傻不拉几地把整个线程都给你的脚本,系统忙的时候,即使是不断循环也要排队。这导致一个非常严重的问题:在不同分辨率下(对,你没有看错),睡眠的延时会有区别,分辨率越低,延时越短(越准确),全屏无窗口延时最长(但是每次延时都一样)。这意味着不同分辨率的用户还需要针对自己的分辨率进行时间的微调——这简直太蠢了。

    换其他睡眠方式精度不够,这种方式又对分辨率敏感,那只有通过调整整体架构来减少误差了:将相对睡眠时间换成绝对睡眠时间。在传统的脚本中,每此睡眠的时间的相对的,比如每次移动后睡眠80ms,理解起来很直观。但是,这种相对睡眠会导致误差累计,加入每次睡眠偏差1ms,一个弹夹下来可能就偏差了30ms。如果采用绝对睡眠,如80ms时移动第一次,160ms时移动第二次,每次移动时相当于进行了一次校验与误差修正,使得最后累计误差与单次误差相当。

    但是,一直采用轮询的方式cpu占用率很高,实际使用时如果遇到cpu比较紧张的情况(比如打b5反作弊在疯狂扫盘),会导致压枪时用户移动鼠标困难。为了解决这个问题,脚本实际上是第一种睡眠进行相对睡眠、第二种睡眠进行绝对睡眠。也就是说,先用系统自带的sleep睡眠理论时长的2/3,然后切换到轮询睡眠,到达绝对时间后继续下一步。如此一来,高cpu占用率的时间减少到只用轮询睡眠情况下的1/3。至此,脚本压枪效果很好,不同环境下运行也相当稳定。

    除了平滑处理外,实际上自动检测的更新也值得一提。在新脚本中,自动检测与主脚本拆成了两个脚本以实现双线程。如此一来,主脚本中由于开启自动检测,导致主循环所需时长增加的问题得以有效解决。然而我个人认为最巧妙的地方还是两个脚本之间的传值,与传统的用ini文件读写传值不同,我采用的是通过像素点颜色进行传值:自动检测脚本在屏幕右上角生成特定颜色的gui,然后主脚本读取特定位置像素颜色。在ahk中,抓取单个像素颜色要比读取ini文件快得多,并且一个色块其实可以传递256*256*256=2^24 bits数据,带宽非常大。当然,传输的数据越多,解码所需要的时间也越长,但是if判断是执行时间最短的操作之一。

    总结一下,对于压枪平滑处理的整个过程主要难点就是在有限精度的情况下如何尽可能地进行误差修正。其余添加的一些小功能,不足挂齿,有兴趣的直接看源码吧(但是由于up主很懒,所以没有进行详细注释)。

    这版是最后的版本了,up主表示再也不想碰压枪脚本了(调得快秃了)。其他脚本看心情,下一步可能试着用TensorFlow实现基于人工智能的自瞄。如果这帖子被删/被锁定,不会重新发布,也许会发个英文版在unknown cheats上。

    最后是喜闻乐见的源码分享:

    学校网盘(可以直链下载,但是不定时抽风):               https://pan.seu.edu.cn:443/#/link/4804921DF8D922D0DE23E329082CEA50

    百度网盘: 

    链接:https://pan.baidu.com/s/1beVSarI68Qbxmb3Fp2Q0_A 

    提取码:y592

    一键三连就算了,下载的都点个赞好吧,觉得好用的投个币好吧,这网盘下载量与点赞投币数完全不一样啊秋梨膏,up主还想早点升5级呢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3